﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Text;

namespace Sinacor.Tools.Dado
{
    public class Mensagem : DadoBase<Entidade.Mensagem>
    {
        public override void incluir(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            string sql = string.Format(@" INSERT INTO TFWDMENSAGEM ("
                + "CODIGOMENSAGEM"
                + ", CODIGOSTATUSMENSAGEM"
                + ", CODIGOTIPOMENSAGEM"
                + ", PROPOSITOMENSAGEM"
                + ", RESOURCEKEY"
                + ", MODULO"
                + ", SUBMODULO"
                + ", COD_USUA_LOGN"
                + ") VALUES "
                + "({0}"
                + ", {1}"
                + ", {2}"
                + ", '{3}'"
                + ", '{4}'"
                + ", '{5}'"
                + ", '{6}'"
                + ", '{7}')"
                , entidade.Id.Value.ToString()
                , entidade.StatusMensagem.Id.Value.ToString()
                , entidade.TipoMensagem.Id.Value.ToString()
                , entidade.Proposito.Trim()
                , entidade.ResourceKey.Trim()
                , entidade.Modulo.Trim()
                , entidade.Submodulo.Trim()
                , entidade.UsuarioLogado.Trim());

            ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem>();
            using (IDbCommand cmd = dados.getCommand(sql.ToString(), CommandType.Text))
            {
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
            }
        }
                
        public void incluirTraducao(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            string sql = string.Format(@" INSERT INTO TFWDTRADUCAOMENSAGEM (
                                             CODIGOMENSAGEM
                                            ,COD_TXT_MSG
                                            ,CODIGOSTATUSTRADUCAO)
                                             VALUES ( 
                                             {0}
                                            ,{1}
                                            ,{2})"
                                            , entidade.Id.Value.ToString()
                                            , entidade.Traducao.IdMensagem.Value.ToString()   
                                            , entidade.Traducao.StatusTraducao.Id.ToString());  
                
            ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem>();
            using (IDbCommand cmd = dados.getCommand(sql, CommandType.Text))
            {
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
            }

        }

        public void alterarTraducao(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            string sql = string.Format(@" UPDATE TFWDTRADUCAOMENSAGEM SET " 
                +" COD_TXT_MSG = {0}"
                +" WHERE CODIGOMENSAGEM = {1}"
                                            , entidade.Traducao.IdMensagem.Value.ToString()
                                            , entidade.Id.Value.ToString());

            ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem>();
            using (IDbCommand cmd = dados.getCommand(sql, CommandType.Text))
            {
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
            }

        }

        //reindentado para entendimento - esertorio - 200809301154
        public override void alterar(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            string sql = string.Format(@" UPDATE TFWDMENSAGEM SET "
                +"  CODIGOSTATUSMENSAGEM = {0}"
                +", CODIGOTIPOMENSAGEM = {1}"
                +", PROPOSITOMENSAGEM = '{2}'"
                +", RESOURCEKEY = '{3}'"
                +", MODULO = '{4}'"
                +", SUBMODULO = '{5}'"
                +" WHERE CODIGOMENSAGEM = {6}"
                , entidade.StatusMensagem.Id.Value.ToString()
                , entidade.TipoMensagem.Id.Value.ToString()
                , entidade.Proposito.Trim()
                , entidade.ResourceKey.Trim()
                , entidade.Modulo.Trim()
                , entidade.Submodulo.Trim()
                , entidade.Id.Value.ToString());
            ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem>();
            using (IDbCommand cmd = dados.getCommand(sql, CommandType.Text))
            {
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
            }
        }

        public override void deletar(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            string sql = string.Format(@" DELETE FROM TFWDMENSAGEM WHERE CODIGOMENSAGEM = {0} ", entidade.Id.Value.ToString());

            ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem>();
            using (IDbCommand cmd = dados.getCommand(sql, CommandType.Text))
            {
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
            }
        }

        public override List<Sinacor.Tools.Entidade.Mensagem> consultar(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            ResourceAccess<Sinacor.Tools.Entidade.Mensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.Mensagem>();
            IDbCommand cmd = dados.getCommand(this.getQuery(entidade), CommandType.Text);
            return dados.getListResult(cmd);         
        }

        public List<Sinacor.Tools.Entidade.Mensagem> ConsultarMensagemResourceKey(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            ResourceAccess<Sinacor.Tools.Entidade.Mensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.Mensagem>();
            IDbCommand cmd = dados.getCommand(this.getQueryConsultarMensagemResourceKey(entidade), CommandType.Text);
            return dados.getListResult(cmd);
        }


        public List<Sinacor.Tools.Entidade.Mensagem> consultarResourceKey(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            ResourceAccess<Sinacor.Tools.Entidade.Mensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.Mensagem>();
            IDbCommand cmd = dados.getCommand(this.getQueryConsultaResourceKey(entidade), CommandType.Text);
            return dados.getListResult(cmd);
        }
        public List<Sinacor.Tools.Entidade.Mensagem> consultarMensagem(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            ResourceAccess<Sinacor.Tools.Entidade.Mensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.Mensagem>();
            IDbCommand cmd = dados.getCommand(this.getQueryConsultarMensagem(entidade), CommandType.Text);
            return dados.getListResult(cmd);
        }        

        public object possuiExcecaoCadastrada(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            object retorno = null;
            string sql = string.Format("SELECT 1 FROM TFWDEXCECAO WHERE CODIGOMENSAGEM = {0}", entidade.Id);
            ResourceAccess<Sinacor.Tools.Entidade.Mensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.Mensagem>();
            using (IDbCommand cmd = dados.getCommand(sql, CommandType.Text))
            {
                retorno = cmd.ExecuteScalar();
                if (retorno == DBNull.Value)
                    retorno = null;
                cmd.Connection.Close();                
            }
            return retorno;
        }

        //reindentado para entendimento - esertorio - 200809301154
        private string getQuery(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            StringBuilder sql = new StringBuilder();
            sql.Append(@" SELECT  TFWDMENSAGEM.CODIGOMENSAGEM As ""Id""
                                , TFWDMENSAGEM.CODIGOSTATUSMENSAGEM As ""StatusMensagem.Id""
                                , TFWDSTATUSMENSAGEM.DESCRICAOSTATUSMENSAGEM As ""StatusMensagem.Descricao""
                                , TFWDMENSAGEM.CODIGOTIPOMENSAGEM As ""TipoMensagem.Id""
                                , TFWDTIPOMENSAGEM.DESCRICAOTIPOMENSAGEM As ""TipoMensagem.Descricao""
                                , TFWDMENSAGEM.PROPOSITOMENSAGEM As ""Proposito""
                                , TFWDMENSAGEM.RESOURCEKEY As ""ResourceKey""
                                , TFWDMENSAGEM.MODULO As ""Modulo""
                                , TFWDMENSAGEM.SUBMODULO As ""Submodulo""
                                , TFWDTXT_MSG.TXT_MSG As ""Traducao.MensagemTraduzida""
                                , TFWDSTATUSTRADUCAO.CODIGOSTATUSTRADUCAO As ""StatusTraducao.Id""
                                , TFWDSTATUSTRADUCAO.DESCRICAOSTATUSTRADUCAO As ""StatusTraducao.Descricao""
                                , TFWDIDIOMA.CODIGOIDIOMA As ""Traducao.Idioma.Id""
                                , TFWDIDIOMA.NOMEIDIOMA As ""Traducao.Idioma.Descricao""
                         FROM
                         TFWDMENSAGEM
                         INNER JOIN TFWDSTATUSMENSAGEM ON TFWDMENSAGEM.CODIGOSTATUSMENSAGEM = TFWDSTATUSMENSAGEM.CODIGOSTATUSMENSAGEM 
                         INNER JOIN TFWDTIPOMENSAGEM ON TFWDTIPOMENSAGEM.CODIGOTIPOMENSAGEM = TFWDMENSAGEM.CODIGOTIPOMENSAGEM 
                         INNER JOIN TFWDTRADUCAOMENSAGEM ON TFWDTRADUCAOMENSAGEM.CODIGOMENSAGEM = TFWDMENSAGEM.CODIGOMENSAGEM 
                         INNER JOIN TFWDSTATUSTRADUCAO ON TFWDSTATUSTRADUCAO.CODIGOSTATUSTRADUCAO = TFWDTRADUCAOMENSAGEM.CODIGOSTATUSTRADUCAO 
                         INNER JOIN TFWDTXT_MSG ON TFWDTXT_MSG.COD_TXT_MSG = TFWDTRADUCAOMENSAGEM.COD_TXT_MSG
                         INNER JOIN TFWDIDIOMA ON TFWDIDIOMA.CODIGOIDIOMA = TFWDTXT_MSG.CODIGOIDIOMA
                         WHERE (1=1)");

            if (entidade.Id >= 0)
            {
                sql.Append(" AND (TFWDMENSAGEM.CODIGOMENSAGEM = " + entidade.Id.Value.ToString() + ") ");
            }

            if (entidade.StatusMensagem != null && entidade.StatusMensagem.Id > 0)
            {
                sql.Append(" AND (TFWDMENSAGEM.CODIGOSTATUSMENSAGEM LIKE '%" + entidade.StatusMensagem.Id.Value.ToString() + "%') ");
            }

            if (entidade.TipoMensagem != null && entidade.TipoMensagem.Id > 0)
            {
                sql.Append(" AND (TFWDMENSAGEM.CODIGOTIPOMENSAGEM LIKE '%" + entidade.TipoMensagem.Id.Value.ToString() + "%') ");
            }

            if (!string.IsNullOrEmpty(entidade.Proposito))
            {
                sql.Append(" AND (TFWDMENSAGEM.PROPOSITOMENSAGEM LIKE '%" + entidade.Proposito.Trim() + "%') ");
            }

            if (!string.IsNullOrEmpty(entidade.ResourceKey))
            {
                sql.Append(" AND (UPPER(TFWDMENSAGEM.RESOURCEKEY) LIKE '%" + entidade.ResourceKey.Trim().ToUpper() + "%') "); //alt - TO_UPPER/ToUpper para pesquisa nao sensitiva - esertorio - 200810151835
            }

            if (!string.IsNullOrEmpty(entidade.Modulo))
            {
                sql.Append(" AND (TFWDMENSAGEM.MODULO LIKE '" + entidade.Modulo.Trim() + "') ");
            }

            if (!string.IsNullOrEmpty(entidade.Submodulo))
            {
                sql.Append(" AND (TFWDMENSAGEM.SUBMODULO LIKE '%" + entidade.Submodulo.Trim() + "%') ");
            }

            if ((entidade.Traducao != null) && (!string.IsNullOrEmpty(entidade.Traducao.MensagemTraduzida)))
            {
                sql.Append(" AND (TFWDTXT_MSG.TXT_MSG LIKE '%" + entidade.Traducao.MensagemTraduzida + "%')");
            }

            return sql.ToString();
        }

        private string getQueryConsultarMensagemResourceKey(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            StringBuilder sql = new StringBuilder();
            string retorno;
            string queryMensagem = string.Empty; 
            
            string filtroIgualdade = string.Empty;
            string filtroLike = " UPPER(:ColunaTabela) LIKE UPPER('%' || TRANSLATE(':DadoFiltro','âàãáÁÂÀÃéêÉÊíÍóôõÓÔÕüúÜÚÇçñ!@#$¨&*()-_=+´[{]}~^;:/?º|\\/., ',LPAD('%', 100, '%')) || '%')"; ;
            
            string filtroIdioma = string.Empty;
            string filtroQuery = string.Empty;

            string ordenacaoColuna = string.Empty;
            string exibeColuna = string.Empty;


            #region Filtro Idioma
            if (entidade.Traducao != null)
            {
                if (entidade.Traducao.Idioma != null)
                {
                    if (entidade.Traducao.Idioma.Id.HasValue)
                    {
                        filtroQuery = "WHERE";
                        filtroIdioma = filtroQuery + " TXT.CODIGOIDIOMA  = " + entidade.Traducao.Idioma.Id.Value.ToString();
                        filtroQuery = "AND";
                    }
                }
            }
            #endregion
                    
            switch (entidade.TipoFiltroMensagem)
            {
                case Sinacor.Tools.Entidade.Enum.TipoFiltroMensagem.Mensagem:

                    if (entidade.Traducao != null)
                    {
                        if (!string.IsNullOrEmpty(entidade.Traducao.MensagemTraduzida))
                        {
                            filtroIgualdade = filtroQuery + " TXT.TXT_MSG = '" + entidade.Traducao.MensagemTraduzida + "'";
                            filtroLike = filtroQuery + filtroLike.Replace(":ColunaTabela", "TXT.TXT_MSG");
                            filtroLike = filtroLike.Replace(":DadoFiltro", entidade.Traducao.MensagemTraduzida);
                        }
                        else
                        {
                            filtroLike = string.Empty;
                        }
                    }
                    else
                    {
                        filtroLike = string.Empty;  
                    }
                    ordenacaoColuna = "TXT_MSG";

                    #region SubConsultaMensagem
                    queryMensagem = @"SELECT  TXT.COD_TXT_MSG
                                             ,TXT.TXT_MSG
                                             ,TXT.COD_USUA_LOGN
                                             ,TXT.CODIGOIDIOMA
                                             ,IDM.SIGLAIDIOMA         
                                      FROM TFWDIDIOMA IDM
                                      INNER JOIN TFWDTXT_MSG TXT ON IDM.CODIGOIDIOMA = TXT.CODIGOIDIOMA";
                    #endregion

                    #region Query Mensagem
                    
                    sql.AppendLine(@"SELECT COD_TXT_MSG as ""Id""
                                           ,TXT_MSG As ""Traducao.MensagemTraduzida""
                                           ,COD_USUA_LOGN as ""Traducao.UsuarioLogado""
                                           ,CODIGOIDIOMA As ""Traducao.Idioma.Id""
                                     FROM (");
                    #region QueryConsulta
                        sql.AppendLine(queryMensagem);
                        sql.AppendLine(filtroIdioma);
                        sql.AppendLine(filtroIgualdade);

                        sql.AppendLine("UNION");
                        sql.AppendLine(queryMensagem);
                        sql.AppendLine(filtroIdioma);
                        sql.AppendLine(filtroLike);  
                                              
                    #endregion

                    sql.AppendLine(@"     ) 
                            ORDER BY " + ordenacaoColuna);
                    #endregion

                    break;
                case Sinacor.Tools.Entidade.Enum.TipoFiltroMensagem.ResouceKey:

                    //if (!string.IsNullOrEmpty(entidade.ResourceKey))
                    //{
                    //    filtroIgualdade = filtroQuery + " MSG.RESOURCEKEY = '" + entidade.ResourceKey + "'";
                    //    filtroLike = filtroQuery + " MSG.RESOURCEKEY LIKE '%" + entidade.ResourceKey + "%'";                 
                    //    filtroCapitalizada = filtroQuery + " UPPER(MSG.RESOURCEKEY) LIKE UPPER('%' || TRANSLATE('" + entidade.Traducao.MensagemTraduzida + "','âàãáÁÂÀÃéêÉÊíÍóôõÓÔÕüúÜÚÇçñ!@#$¨&*()-_=+´[{]}~^;:/?º|\\/., ',LPAD('%', 100, '%')) || '%')";
                    //}
                    if (string.IsNullOrEmpty(entidade.ResourceKey))                    
                        filtroLike = string.Empty;                    
                    else
                    {
                        filtroIgualdade = filtroQuery + " MSG.RESOURCEKEY = '" + entidade.ResourceKey + "'";
                        filtroLike = filtroQuery + filtroLike.Replace(":ColunaTabela", "MSG.RESOURCEKEY");
                        filtroLike = filtroLike.Replace(":DadoFiltro", entidade.ResourceKey);
                    }
                    
                    ordenacaoColuna = "RESOURCEKEY";

                    #region SubConsultaMensagem
                    queryMensagem = @"SELECT  MSG.CODIGOMENSAGEM  
                                       ,MSG.PROPOSITOMENSAGEM
                                       ,MSG.RESOURCEKEY
                                       
                                       ,MSG.MODULO
                                       ,MSG.SUBMODULO
                                       ,MSG.COD_USUA_LOGN

                                       ,MSG.CODIGOSTATUSMENSAGEM 
                                       ,STM.DESCRICAOSTATUSMENSAGEM 
                                    
                                       ,TXT.COD_TXT_MSG
                                       ,TXT.TXT_MSG 

                                       ,TMG.CODIGOTIPOMENSAGEM
                                       ,TMG.DESCRICAOTIPOMENSAGEM
                                       
                                       ,TDM.CODIGOSTATUSTRADUCAO       
                                       ,STR.DESCRICAOSTATUSTRADUCAO                                 
                                       ,TXT.COD_USUA_LOGN AS USUARIOLOGADOTEXTO
                                        
                                       ,TXT.CODIGOIDIOMA
                                       ,IDM.SIGLAIDIOMA   
                                       ,IDM.NOMEIDIOMA
      
                                FROM TFWDIDIOMA IDM
                                INNER JOIN TFWDTXT_MSG TXT    ON IDM.CODIGOIDIOMA         = TXT.CODIGOIDIOMA 
                                INNER JOIN TFWDTRADUCAOMENSAGEM TDM ON TXT.COD_TXT_MSG  = TDM.COD_TXT_MSG
                                INNER JOIN TFWDSTATUSTRADUCAO STR   ON TDM.CODIGOSTATUSTRADUCAO = STR.CODIGOSTATUSTRADUCAO                                
                                INNER JOIN TFWDMENSAGEM MSG         ON TDM.CODIGOMENSAGEM       = MSG.CODIGOMENSAGEM
                                INNER JOIN TFWDTIPOMENSAGEM TMG     ON MSG.CODIGOTIPOMENSAGEM   = TMG.CODIGOTIPOMENSAGEM
                                INNER JOIN TFWDSTATUSMENSAGEM STM   ON MSG.CODIGOSTATUSMENSAGEM = STM.CODIGOSTATUSMENSAGEM";
                    #endregion
                    
                    #region Query ResouceKey

                    sql.AppendLine(@"SELECT   CODIGOMENSAGEM    As ""Id""
                                            , PROPOSITOMENSAGEM As ""Proposito""
                                            , RESOURCEKEY       As ""ResourceKey""

                                            , MODULO            As ""Modulo""
                                            , SUBMODULO         As ""Submodulo""
                                            , COD_USUA_LOGN     AS ""UsuarioLogado""

                                            , CODIGOSTATUSMENSAGEM    As ""StatusMensagem.Id""
                                            , DESCRICAOSTATUSMENSAGEM As ""StatusMensagem.Descricao""
                                            , CODIGOTIPOMENSAGEM    As ""TipoMensagem.Id""

                                            , DESCRICAOTIPOMENSAGEM As ""TipoMensagem.Descricao""
                                            , COD_TXT_MSG  As ""Traducao.IdMensagem""
                                            , TXT_MSG        As ""Traducao.MensagemTraduzida""

                                            , COD_USUA_LOGN        As ""Traducao.UsuarioLogado""
                                            , NOMEIDIOMA      As ""Traducao.Idioma.Descricao""
                                            , CODIGOIDIOMA    As ""Traducao.Idioma.Id""

                                            , CODIGOSTATUSTRADUCAO    As ""StatusTraducao.Id""
                                            , DESCRICAOSTATUSTRADUCAO As ""StatusTraducao.Descricao""
                                            , USUARIOLOGADOTEXTO as ""Traducao.UsuarioLogado""

                                     FROM (");
                    #region QueryConsulta
                    sql.AppendLine(queryMensagem);
                    sql.AppendLine(filtroIdioma);
                    sql.AppendLine(filtroIgualdade);

                    sql.AppendLine("UNION");
                    sql.AppendLine(queryMensagem);
                    sql.AppendLine(filtroIdioma);
                    sql.AppendLine(filtroLike);
                                        
                    #endregion

                    sql.AppendLine(@"     ) 
                            ORDER BY " + ordenacaoColuna);
                    #endregion

                    break;
                default:
                    break;
            }            

            retorno = sql.ToString();
            return retorno;
        }
        
        private string getQueryConsultarMensagem(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            StringBuilder sql = new StringBuilder();
            string retorno;
            string filtroIdioma = string.Empty;
            string filtroQuery = string.Empty;

            #region Filtro Idioma
            if (entidade.Traducao != null)
            {
                if (entidade.Traducao.Idioma != null)
                {
                    if (entidade.Traducao.Idioma.Id.HasValue)
                    {
                        filtroQuery = "WHERE";
                        filtroIdioma = filtroQuery + " TXT.CODIGOIDIOMA  = " + entidade.Traducao.Idioma.Id.Value.ToString();
                        filtroQuery = "AND";
                    }
                }
            }
            #endregion

            sql.AppendLine(@"SELECT  TXT.COD_TXT_MSG  AS ""Id""
                                    ,TXT.TXT_MSG  AS ""Traducao.MensagemTraduzida""                                    
                                    ,TXT.COD_USUA_LOGN  AS ""Traducao.UsuarioLogado""                                 
                                    ,TXT.CODIGOIDIOMA   AS ""Traducao.Idioma.Id"" 
                             FROM TFWDIDIOMA IDM
                             INNER JOIN TFWDTXT_MSG TXT    ON IDM.CODIGOIDIOMA         = TXT.CODIGOIDIOMA 
                             INNER JOIN TFWDTRADUCAOMENSAGEM TDM ON TXT.COD_TXT_MSG  = TDM.COD_TXT_MSG
                             INNER JOIN TFWDMENSAGEM MSG         ON TDM.CODIGOMENSAGEM       = MSG.CODIGOMENSAGEM");
            sql.AppendLine(filtroIdioma);

            if (entidade.Id.HasValue)
                sql.AppendLine(filtroQuery + "   MSG.CODIGOMENSAGEM = " + entidade.Id.Value.ToString());

            if (entidade.Traducao != null)
            {
                if (entidade.Traducao.IdMensagem.HasValue)
                    sql.AppendLine(filtroQuery + "   TXT.COD_TXT_MSG = " + entidade.Traducao.IdMensagem.Value.ToString());
            }

            sql.AppendLine("ORDER BY TXT.TXT_MSG ");
            
            retorno = sql.ToString();

            return retorno;
        }

        private string getQueryConsultaResourceKey(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            StringBuilder sql = new StringBuilder();
            string retorno;
            string filtroIdioma = string.Empty;
            string filtroQuery = string.Empty;

            #region Filtro Idioma
            if (entidade.Traducao != null)
            {
                if (entidade.Traducao.Idioma != null)
                {
                    if (entidade.Traducao.Idioma.Id.HasValue)
                    {
                        filtroQuery = "WHERE";
                        filtroIdioma = filtroQuery + " TXT.CODIGOIDIOMA  = " + entidade.Traducao.Idioma.Id.Value.ToString();
                        filtroQuery = "AND";
                    }
                }
            }
            #endregion

            sql.AppendLine(@"SELECT   MSG.CODIGOMENSAGEM    As ""Id""
                                    , MSG.PROPOSITOMENSAGEM As ""Proposito""
                                    , MSG.RESOURCEKEY       As ""ResourceKey""
                                    , MSG.MODULO            As ""Modulo""
                                    , MSG.SUBMODULO         As ""Submodulo""
                                    , MSG.COD_USUA_LOGN     AS ""UsuarioLogado""

                                    , MSG.CODIGOSTATUSMENSAGEM    As ""StatusMensagem.Id""
                                    , STM.DESCRICAOSTATUSMENSAGEM As ""StatusMensagem.Descricao""

                                    , MSG.CODIGOTIPOMENSAGEM    As ""TipoMensagem.Id""
                                    , TMG.DESCRICAOTIPOMENSAGEM As ""TipoMensagem.Descricao""


                                    , TXT.COD_TXT_MSG  As ""Traducao.IdMensagem""
                                    , TXT.TXT_MSG        As ""Traducao.MensagemTraduzida""
                                    , TXT.COD_USUA_LOGN        As ""Traducao.UsuarioLogado""

                                    , IDM.NOMEIDIOMA      As ""Traducao.Idioma.Descricao""
                                    , IDM.CODIGOIDIOMA    As ""Traducao.Idioma.Id""

                                    , TDM.CODIGOSTATUSTRADUCAO    As ""StatusTraducao.Id""
                                    , STR.DESCRICAOSTATUSTRADUCAO As ""StatusTraducao.Descricao""
                                                               
                             FROM TFWDIDIOMA IDM
                             INNER JOIN TFWDTXT_MSG TXT    ON IDM.CODIGOIDIOMA         = TXT.CODIGOIDIOMA 
                             INNER JOIN TFWDTRADUCAOMENSAGEM TDM ON TXT.COD_TXT_MSG  = TDM.COD_TXT_MSG
                             INNER JOIN TFWDSTATUSTRADUCAO STR   ON TDM.CODIGOSTATUSTRADUCAO = STR.CODIGOSTATUSTRADUCAO
                             INNER JOIN TFWDMENSAGEM MSG         ON TDM.CODIGOMENSAGEM       = MSG.CODIGOMENSAGEM
                             INNER JOIN TFWDTIPOMENSAGEM TMG     ON MSG.CODIGOTIPOMENSAGEM   = TMG.CODIGOTIPOMENSAGEM
                             INNER JOIN TFWDSTATUSMENSAGEM STM   ON MSG.CODIGOSTATUSMENSAGEM = STM.CODIGOSTATUSMENSAGEM ");
            sql.AppendLine(filtroIdioma);
            
            if (entidade.Id.HasValue)
                sql.AppendLine(filtroQuery + "   MSG.CODIGOMENSAGEM = " + entidade.Id.Value.ToString());

            if(entidade.Traducao != null)
            {
                if (entidade.Traducao.IdMensagem.HasValue)
                    sql.AppendLine(filtroQuery + "   TXT.COD_TXT_MSG = " + entidade.Traducao.IdMensagem.Value.ToString());
            }
            
            sql.AppendLine(" ORDER BY RESOURCEKEY ");

            retorno = sql.ToString();

            return retorno;
        }

        public object jaEstaCadastrada(Sinacor.Tools.Entidade.Mensagem entidade)
        {
            object retorno = null;
            string sql = string.Format("SELECT 1 FROM TFWDMENSAGEM WHERE (UPPER(RESOURCEKEY) = '{0}') ",entidade.ResourceKey.Trim().ToUpper());
            
            ResourceAccess<Sinacor.Tools.Entidade.Mensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.Mensagem>();
            using (IDbCommand cmd = dados.getCommand(sql, CommandType.Text))
            {
                retorno = cmd.ExecuteScalar();
                if (retorno == DBNull.Value)
                    retorno = null;
                cmd.Connection.Close();
            }

            return retorno;           
        }
        
        public object buscarProximoId()
        {
            object retorno = null;
            StringBuilder sql = new StringBuilder(@" SELECT MAX(CODIGOMENSAGEM) + 1 FROM TFWDMENSAGEM ");
            ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem>();
            using (IDbCommand cmd = dados.getCommand(sql.ToString(), CommandType.Text))
            {
                retorno = cmd.ExecuteScalar();
                if (retorno == DBNull.Value)
                    retorno = null;
                cmd.Connection.Close();
            }
            return retorno;
        }
         public object buscarProximoTextoId()
        {
            object retorno = null;
            StringBuilder sql = new StringBuilder(@" SELECT STFWDTXT_MSG.NEXTVAL FROM DUAL ");
            ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem> dados = new ResourceAccess<Sinacor.Tools.Entidade.TipoMensagem>();
            using (IDbCommand cmd = dados.getCommand(sql.ToString(), CommandType.Text))
            {
                retorno = cmd.ExecuteScalar();
                if (retorno == DBNull.Value)
                    retorno = null;
                cmd.Connection.Close();
            }
            return retorno;
        }

    }
}
